home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
gpen32k
/
source.exe
/
SRC
/
GPEN32K.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-09
|
24KB
|
1,036 lines
/*****************************************************************
TOWNS最強のパターンエディタ
G-Pen32k
Copyright(C) 1991,1992,1993 Okome
*****************************************************************/
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <fmcfrb.h>
#include <EGB.H>
#include <MOS.H>
#include <sidework.h>
#include <kkstr2.h>
#include <normlib.h>
#include <okome.h>
#define MAIN
#include <GPen32k.h>
#undef MAIN
void draw() /* 画面初期化 */
{
int i, x, y;
char c[64] = { 0x00,0x00, 0x10,0x00, 0x00,0x02, 0x10,0x02,
0x00,0x40, 0x10,0x40, 0x00,0x42, 0x10,0x42,
0x08,0x21, 0x1f,0x00, 0xe0,0x03, 0xff,0x03,
0x00,0x7c, 0x1f,0x7c, 0xe0,0x7f, 0xff,0x7f };
wpg(0);
EGB_tmenuPalette2( work );
/* MEN_sidein(2); */ /* メニューへのサイドワークの追加 登録のみ */
MEN_set(2);
EGB_textSpace( work, 7 );
symbol( 589, 17, "大終", 16, 15 );
EGB_textSpace( work, 0 );
boxf( 0, 20, 639, 479, BCL );
KAN_disp(KAN_DISPON);
KAN_setMode(0x30140);
wpg(1);
EGB_displayStart( work, 2, bi, bi );
EGB_displayStart( work, 3, 640/bi, 480/bi );
egbputZ( CSX1, CSY1, CSX2, CSY2, 16, 1, c );
for ( y = 0; y <= 2; y++ )
{
for ( i = 0; i < 32; i++ )
{
WORD(c+i*2) = i * (1 << ((2 - y) * 5));
}
egbputZ(PALX, PALY+y*PALB, PALX+127, PALY+(y+1)*PALB-1, 32, 1, c);
}
tcl(1, 0);
tcl(2, 1);
wpg(0);
biboxbf( WX1, WY1, WX2, WY2, 0, 8, 8 );
biboxbf( BX1, BY1, BX2, BY2, 0, 8, 8 );
biboxbf( NX1, NY1, NX2, NY2, 0, 4, 4 );
biboxbf( CSX1, CSY1, CSX2, CSY2, 0, 2, 2 );
biboxbf( CBX1, CBY1, CBX2, CBY2, 0, 4, 4 );
biboxbf( CBLX1, CBLY1, CBLX2, CBLY2, 0, 2, 2 );
biboxbf( CBRX1, CBRY1, CBRX2, CBRY2, 0, 2, 2 );
ubox( CSBX1, CSBY1, CSBX2, CSBY2, 15, 8 );
for ( i = 0; i < MEZ0; i++ )
{
x = i % MEX2;
y = i / MEX2;
ubox( MEX1+MEX4*x, MEY1+MEY4*y,
MEX1+MEX4*(x+1)-1, MEY1+MEY4*(y+1)-1, 15, 8 );
}
symbol( MEX1+5, MEY1+ 18, " ~ /", 16, 14 );
symbol( MEX1+5, MEY1+MEY4 +18, " □ ■", 16, 14 );
symbol( MEX1+5, MEY1+MEY4* 2+18, " ○ ●", 16, 14 );
symbol( MEX1+5, MEY1+MEY4* 3+18, "楕○楕●", 16, 14 );
symbol( MEX1+5, MEY1+MEY4* 4+18, "↑↓←→", 16, 14 );
symbol( MEX1+4, MEY1+MEY4* 5+18, "Poly 塗", 16, 14 );
symbol( MEX1+4, MEY1+MEY4* 6+18, "CopyRoll", 16, 14 );
symbol( MEX1+4, MEY1+MEY4* 7+18, "ぼけ回転", 16, 14 );
symbol( MEX1+4, MEY1+MEY4* 8+18, "拡縮反転", 16, 14 );
symbol( MEX1+5, MEY1+MEY4* 9+18, " ⇔ ⇔重", 16, 15 );
symbol( MEX1+5, MEY1+MEY4*10+18, " ~ Roll", 16, 15 );
symbol( MEX1+4, MEY1+MEY4*11+18, "色々もわ", 16, 15 );
wkugiri(1);
biboxbf( PALX, PALY, PALX+127, PALY+PALB*3-1, 0, 4, 28 );
biboxbf( PCX1, PCY1, PCX2, PCY2, 0, 0, 0 );
biboxbf( PLX1, PLY1, PLX2, PLY2, 0, 0, 0 );
biboxbf( PRX1, PRY1, PRX2, PRY2, 0, 0, 0 );
ubox( SPX1, SPY1, SPX2, SPY2, 15, 8 );
ubox( RX1, RY1, RX2, RY2, 15, 8 );
symbol( SPX1+5, SPY2-2, "Spoit", 16, 15 );
symbol( SPX1+4, SPY2-3, "Spoit", 16, 8 );
ubox( PAX1, PAY1, PAX2, PAY2, 8, 15 );
ubox( HX1, HY1, HX2, HY2, 8, 15 );
bfgs(1);
for (y=0; y<=2; y++)
mcolms(y);
wpg(1);
mbclp();
page(0);
}
int sachk(char *nn)
{
if (_access(nn,0)==0)
{
return (message("上書きしますか?",2));
}
return (0);
}
void raten( int mb, int cx, int cy, int x1, int y1, int x2, int y2,
int sx1, int sy1, int sx2, int sy2 )
{
char pa[64], pab[64];
int n, ws, a, b2, mx, my, c, d;
int x, y, x3, y3, x4, y4, x5, y5, x6, y6, x7=0, y7=0, x8, y8;
double ls, xx, yy, ax, ay;
view( WX1,WY1, WX2,WY2 );
egbget(x1,y1,x2,y2, b);
egbput(640/bi,0, 640/bi+x2-x1,y2-y1, b);
EGB_writePage( work, 0 );
EGB_writeMode( work, 4 );
x3 = x1*bi; y3 = y1*bi;
x4 = x2*bi; y4 = y1*bi;
x5 = x2*bi; y5 = y2*bi;
x6 = x1*bi; y6 = y2*bi;
MOS_disp(0);
connect(5, x3,y3, x4,y3, x4,y4, x3,y4, x3,y3, 0x02, 0x7fff );
MOS_disp(1);
cx /= bi;
cy /= bi;
mbout( &mb, &mx, &my );
mbin( &mb, &x8, &y8 );
do
{
MOS_rdpos( &mb, &x, &y );
if (x7 != x || y7 != y)
{
MOS_disp(0);
connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
MOS_disp(1);
ls = atan2(x8-cx*bi, y8-cy*bi) - atan2(x-cx*bi,y-cy*bi);
xx = x1 - cx;
ax = x2 - cx;
yy = y1 - cy;
ay = y2 - cy;
x3 = (cx + xx * cos(ls) - yy * sin(ls))*bi;
y3 = (cy + xx * sin(ls) + yy * cos(ls))*bi;
x4 = (cx + ax * cos(ls) - yy * sin(ls))*bi;
y4 = (cy + ax * sin(ls) + yy * cos(ls))*bi;
x5 = (cx + ax * cos(ls) - ay * sin(ls))*bi;
y5 = (cy + ax * sin(ls) + ay * cos(ls))*bi;
x6 = (cx + xx * cos(ls) - ay * sin(ls))*bi;
y6 = (cy + xx * sin(ls) + ay * cos(ls))*bi;
MOS_disp(0);
connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
MOS_disp(1);
x7 = x;
y7 = y;
}
} while (mb);
MOS_disp(0);
connect(5, x3,y3, x4,y4, x5,y5, x6,y6, x3,y3, 0x02, 0x7fff );
MOS_disp(1);
EGB_writeMode( work, 0 );
EGB_writePage( work, 1 );
WORD(pa) = 4;
WORD(pa+2) = sx1;
WORD(pa+4) = sy1;
WORD(pa+6) = sx2;
WORD(pa+8) = sy1;
WORD(pa+10) = sx2;
WORD(pa+12) = sy2;
WORD(pa+14) = sx1;
WORD(pa+16) = sy2;
EGB_region( work, &n, &ws, &a, &b2, &c, &d, pa );
pab[0] = 1;
pab[1] = 0;
WORD(pab+2) = (cx-x1)/KS+sx1;
WORD(pab+4) = (cy-y1)/KS+sy1;
ls *= 180.0 / _PI;
if (ls<0)
ls+=360.0;
if (ls>=360.0)
ls-=360.0;
WORD(pab+6) = (int)ls;
EGB_rotate( work, 0, pab, b );
wkk();
}
void ten(int x, int y, int h)
{
int i;
egbget(x,y,x+h-1,y+h-1, b);
for ( i=0; i<h; i++ )
{
egbput(x+i,y,x+i,y+h-1, &b[h*(h-i-1)*2]);
}
}
void mspoit( void )
{
int mb, mx, my;
MOS_disp( 0 );
MOS_typeRom2( 86, 1, 1, mpat );
MOS_disp( 1 );
mbout( &mb, &mx, &my );
do {
MOS_rdpos( &mb, &mx, &my );
} while (mb==0);
MOS_disp( 0 );
MOS_typeRom2( 81, 1, 1, mpat );
MOS_disp( 1 );
tclc(mb, mx, my);
mbout( &mb, &mx, &my );
}
void gmenu( int mx, int my ) /* アイコンMENU */
{
int x, y, i, j;
i = (( mx - MEX1 ) / MEX4) + MEX2 * (( my - MEY1 ) / MEY4);
if ( i<MEZ1 ) {
j = 0;
} else {
j = 1;
}
x = MEX1 +((mei[j] + j * MEZ1) % MEX2)* MEX4;
y = MEY1 + (mei[j] + j * MEZ1) / MEX2 * MEY4;
mei[j] = i - j * MEZ1;
mx = MEX1 +(i % MEX2)* MEX4;
my = MEY1 + i / MEX2 * MEY4;
wpg(0);
ubox( x, y, x+MEX4-1, y+MEY4-1, 15, 8 );
ubox( mx, my, mx+MEX4-1, my+MEY4-1, 8, 15 );
wpg(1);
}
void mcolm( int mb, int mx, int my ) /* カラー選択バー */
{
int i, j, c;
j = ( my - PALY*bi ) / ( PALB*bi );
i = ( 1 << ((2-j)*5) );
umosv(PALX, PALY+PALB*j, PALX+127, PALY+PALB*(j+1)-1 );
while (mb!=0)
{
MOS_rdpos( &mb, &mx, &my );
c = (mx - PALX*bi) / 8;
mcols((mcl[0] & (0xffff - 0x1f * i)) + c * i);
}
mosv(0, 0, 639, 479);
}
void mcolm2( int mb )
{
mcl[mb] = mcl[0];
mbclp();
}
void rollsub( int x3, int y3, int X1, int Y1, int X3, int Y3 )
{
int X2, Y2, Y4;
X2 = X1+X3;
Y2 = Y1+Y3;
Y4 = Y3+1;
egbget( X1, Y1, X1+(x3-1 & X3), Y2, b );
egbget( X1+x3, Y1, X2, Y2, &(b[x3*Y4*2]) );
egbput( X2-(x3-1 & X3), Y2-(y3-1 & Y3), X2, Y2, b );
egbput( X2-(x3-1 & X3), Y1, X2, Y2-y3, &(b[x3*y3*2]) );
egbput( X1, Y2-(y3-1 & Y3), X2-x3, Y2, &(b[x3*Y4*2]) );
egbput( X1, Y1, X2-x3, Y2-y3, &(b[(x3*Y4+(X3-x3+1)*y3)*2]) );
}
void rollsander( int mb, int mx, int my )
{
int x2, y2, x3, y3;
mx = wnx(mx);
my = wny(my);
do
{
MOS_rdpos( &mb, &x2, &y2 );
x3 = mx - wnx(x2) & NX3;
y3 = my - wny(y2) & NY3;
rollsub( x3, y3, NX1, NY1, NX3, NY3 );
wkk();
mx = wnx(x2);
my = wny(y2);
} while (mb);
}
void tometen(int x1, int y1, int x2, int y2)
{
int x, y, mb;
wpg(0);
for (y = y1; y<=y2; y++)
{
EGB_writePage(work,1);
egbget(x1,y,x2,y,b);
EGB_writePage(work,0);
for (x = x1; x<=x2; x++)
{
if ((WORD(b+(x-x1)*2) & 0x8000)!=0)
{
line(x*bi,y*bi,(x+1)*bi-1,(y+1)*bi-1,15);
line((x+1)*bi-1,y*bi,x*bi,(y+1)*bi-1,8);
}
}
}
MOS_typeRom2( 76, 8, 8, mpat );
wpg(1);
mbin(&mb,&x,&y);
mbout(&mb,&x,&y);
wpg(0);
boxf(x1*bi,y1*bi,(x2+1)*bi-1,(y2+1)*bi-1,0);
MOS_typeRom2( 81, 1, 1, mpat );
wpg(1);
}
/* 編集窓用機能軍 */
void mpaint( int mb, int mx, int my )
{
char pa[4];
EGB_paintMode( work, 0x22 );
EGB_color( work, 2, mcl[mb] );
WORD(pa) = wnx(mx);
WORD(pa+2) = wny(my);
EGB_closePaint( work, pa );
wkk();
}
void mdr( int mb, int mx, int my ) /* 編集窓描画 */
{
int mx2, my2, x, y, x2, y2;
mx2 = mx;
my2 = my;
while (mb != 0 && mx/bi >= WX1 && mx/bi <= WX2 &&
my/bi >= WY1 && my/bi <= WY2 )
{
line( wnx(mx2), wny(my2), wnx(mx), wny(my), mcl[mb] );
x = wnx(mx);
x2 = wnx(mx2);
bsz( &x, &x2 );
y = wny(my);
y2 = wny(my2);
bsz( &y, &y2 );
egbget( x, y, x2, y2, b );
egbputZ( WX1+(x-NX1)*KS, WY1+(y-NY1)*KS,
WX1+(x2-NX1+1)*KS-1, WY1+(y2-NY1+1)*KS-1,
x2-x+1, y2-y+1, b );
mx2 = mx;
my2 = my;
MOS_rdpos( &mb, &mx, &my );
}
}
void mwwp( int *mb, int *mx, int *my, int *x, int *y, void (*vfp)(), int f )
{
int x2, y2, b2;
view( WX1,WY1, WX2,WY2 );
umosv( WX1,WY1, WX2,WY2 );
EGB_writeMode( work, 4 );
*mx = wcx(*mx);
*my = wcy(*my);
vfp( *mx, *my, *mx, *my, 0x7fff );
x2 = *mx;
y2 = *my;
do
{
b2 = *mb;
MOS_rdpos( mb, x, y );
*x = wcx(*x);
*y = wcy(*y);
if (*x != x2 || *y != y2 )
{
vfp( *mx, *my, x2, y2, 0x7fff );
vfp( *mx, *my, *x, *y, 0x7fff );
}
x2 = *x;
y2 = *y;
} while (*mb);
if (f==0)
vfp( *mx, *my, x2, y2, 0x7fff );
*mb = b2;
}
void mline( int mb, int mx, int my, void (*vic)() )
{
int x, y;
mwwp( &mb, &mx, &my, &x, &y, vic, 1 );
view( NX1,NY1, NX2,NY2 );
EGB_writeMode( work, 0 );
vic( nbx(mx), nby(my), nbx(x), nby(y), mcl[mb] );
wkk();
}
void mcpyl( int mb, int mx, int my, int c )
{
int x, y, x2, y2, x3, y3;
mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
bsz( &mx, &x );
bsz( &my, &y );
egbget( nbx(mx),nby(my), nbx(x),nby(y), b );
boxb( mx, my, x, y, 0x7fff );
mbin( &mb, &x3, &y3 );
if (mb == 1)
{
if (c)
{
EGB_writeMode( work, 0 );
boxf(wnx(mx),wny(my), wnx(x), wny(y), mcl[2] );
EGB_writeMode( work, 4 );
}
x3 = wcx(x3);
y3 = wcy(y3);
mx -= x3;
my -= y3;
x -= x3;
y -= y3;
do
{
MOS_rdpos( &mb, &x2, &y2 );
x2 = wcx(x2);
y2 = wcy(y2);
while ( x2+x > WX2 )
x2-=KS;
while ( y2+y > WY2 )
y2-=KS;
while ( x2+mx < WX1 )
x2+=KS;
while ( y2+my < WY1 )
y2+=KS;
if (x3 != x2 || y3 != y2 )
{
boxb( x3+mx,y3+my, x3+x,y3+y, 0x7fff );
boxb( x2+mx,y2+my, x2+x,y2+y, 0x7fff );
}
x3 = x2;
y3 = y2;
} while (mb);
view( NX1,NY1, NX2,NY2 );
EGB_writeMode( work, 0 );
egbput( nbx(x3+mx),nby(y3+my), nbx(x3+x),nby(y3+y), b );
}
EGB_writeMode( work, 0 );
wkk();
}
void boke(int mx, int my, int x, int y)
{
int n=0x80, si, x1, y1, x2, y2;
char pa[64];
WORD(pa+0)=4;
WORD(pa+2)=mx;
WORD(pa+4)=my;
WORD(pa+6)=x;
WORD(pa+8)=my;
WORD(pa+10)=x;
WORD(pa+12)=y;
WORD(pa+14)=mx;
WORD(pa+16)=y;
EGB_region( work, &n, &si, &x1,&y1, &x2,&y2, pa );
EGB_resolve(work,b);
}
void hten(int x, int y, int x2, int y2)
{
EGB_writeMode( work, 4 );
boxf( x,y, x2,y2, 0x7fff );
EGB_writeMode( work, 0 );
}
void tens(int mb, int mx, int my, void (*vic)())
{
int x, y;
mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
EGB_writeMode( work, 0 );
view(NX1,NY1,NX2,NY2);
mx = nbx(mx);
my = nby(my);
x = nbx(x);
y = nby(y);
vic(mx,my,x,y);
wkk();
}
void kakshk(int mb, int mx, int my)
{
int x, y, x2, y2, ox, oy, ox2, oy2;
ox = mx;
oy = my;
mwwp( &mb, &ox,&oy, &ox2,&oy2, boxb, 0 );
egbget( nbx(ox),nby(oy), nbx(ox2),nby(oy2), b );
boxb(ox,oy,ox2,oy2,0x7fff);
x2 = abs(nbx(ox2)-nbx(ox))+1;
y2 = abs(nby(oy2)-nby(oy))+1;
mbin(&mb,&mx,&my);
mwwp( &mb, &mx,&my, &x,&y, boxb, 0 );
boxb(ox,oy,ox2,oy2,0x7fff);
EGB_writeMode(work,0);
egbputZ( nbx(mx),nby(my), nbx(x),nby(y), x2,y2, b );
wkk();
}
void polyg( int mb, int mx, int my )
{
int i=6, x, y, ox, oy;
view( WX1,WY1, WX2,WY2 );
umosv( WX1,WY1, WX2,WY2 );
ox = mx;
oy = my;
WORD(b+2) = wnx(mx);
WORD(b+4) = wny(my);
EGB_writeMode(work,4);
line( wcx(mx),wcy(my), wcx(mx),wcy(my), 0x7fff );
while(mb!=2 && i<1020)
{
do
{
x = mx;
y = my;
MOS_rdpos(&mb,&mx,&my);
line( wcx(ox),wcy(oy), wcx(x),wcy(y), 0x7fff );
line( wcx(ox),wcy(oy), wcx(mx),wcy(my), 0x7fff );
} while(mb==0 || (mb==1 && wcx(ox)==wcx(mx) && wcy(oy)==wcy(my)));
ox = mx;
oy = my;
WORD(b+i) = wnx(mx);
WORD(b+i+2) = wny(my);
i+=4;
}
EGB_writeMode(work,0);
WORD(b)=(i-2)/4;
view( NX1,NY1, NX2,NY2 );
EGB_paintMode(work, 0x22);
EGB_color(work, 0, mcl[1]);
EGB_color(work, 2, mcl[1]);
EGB_polygon( work, b );
wkk();
mbout(&mb,&mx,&my);
}
void mnw( int mb, int mx, int my ) /* 編集窓 */
{
view( NX1, NY1, NX2, NY2 );
switch(mei[0])
{
case 1: mline( mb, mx, my, line ); break;
case 2: mline( mb, mx, my, boxb ); break;
case 3: mline( mb, mx, my, boxf ); break;
case 4: mline( mb, mx, my, circlen2 ); break;
case 5: mline( mb, mx, my, circlef2 ); break;
case 6: mline( mb, mx, my, circlenl ); break;
case 7: mline( mb, mx, my, circlefl ); break;
case 8: tens(mb, mx, my, udten); break;
case 9: tens(mb, mx, my, lrten); break;
case 10: polyg( mb, mx, my ); break;
case 11: mpaint( mb, mx, my ); break;
case 12: mcpyl( mb, mx, my, 0 ); break;
case 13: rollsander( mb, mx, my ); break;
case 14: tens( mb, mx, my, boke ); break;
case 15: raten( mb, mx, my, WX1, WY1, WX2, WY2, NX1, NY1, NX2, NY2 );
break;
case 16: kakshk( mb, mx, my ); break;
case 17: tens( mb, mx, my, hten ); break;
default: mdr( mb, mx, my ); break;
}
mosv( 0,0, 639,479 );
view( 0, 0, 1024/bi-1, 512/bi-1 );
}
int gpx(int mx)
{
int mx2;
mx2 = BX1 + ( mx/bi - NX4/2 + ix/2 - BX1 ) / ix * ix;
if ( mx2 < BX1 ) mx2 = BX1;
if ( mx2 + NX3 > BX2 ) mx2 = BX2 - NX3;
return (mx2);
}
int gpy(int my)
{
int my2;
my2 = BY1 + ( my/bi - NY4/2 + iy/2 - BY1 ) / iy * iy;
if ( my2 < BY1 ) my2 = BY1;
if ( my2 + NY3 > BY2 ) my2 = BY2 - NY3;
return (my2);
}
void mbwk( int mx, int my, int c ) /* バッファセット用枠 */
{
static int x = 0, y = 512, c2 = 0;
int mx2, my2;
if ( mx/bi < BX1 || mx/bi > BX2 || my/bi < BY1 || my/bi > BY2 )
{
c = 0;
}
if ( c == 0 )
{
if ( c2 != 0 )
{
wpg(0);
boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
wpg(1);
y = 512;
}
} else {
mx2 = gpx(mx)*bi;
my2 = gpy(my)*bi;
if ( x != mx2 || y != my2 || c2 == 0 )
{
wpg(0);
boxb( x, y, x+NX4*bi-1, y+NY4*bi-1, 0 );
boxb( mx2, my2, mx2+NX4*bi-1, my2+NY4*bi-1, 15 );
wpg(1);
x = mx2;
y = my2;
}
}
c2 = c;
}
void bfgp( int mb, int mx, int my ) /* バッファ編集窓間複写 */
{
int mx2, my2;
mx2 = gpx(mx);
my2 = gpy(my);
if (mb == 1)
{
wget();
egbput(mx2, my2, mx2+NX3, my2+NY3, wb );
} else {
egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
wput();
}
}
void bfsrgp( int mb, int mx, int my ) /* 重ね合わせ */
{
int mx2, my2;
mx2 = gpx(mx);
my2 = gpy(my);
if (mb == 1)
{
wget();
egbput(mx2, my2, mx2+NX3, my2+NY3, wb );
} else {
egbget( NX1, NY1, NX2, NY2, b );
egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
egbput( 320, 0, 320+NX3, NY3, wb );
EGB_color( work, 3, mcl[2] );
EGB_writeMode( work, 6 );
egbput( 320, 0, 320+NX3, NY3, b );
EGB_writeMode( work, 0 );
egbget( 320, 0, 320+NX3, NY3, wb );
wput();
}
}
void bfdraw( int mb, int mx, int my )
{
int mx2, my2;
mx2 = mx;
my2 = my;
while (mb != 0) {
if (mx2/bi >= BX1 && mx2/bi <= BX2 &&
my2/bi >= BY1 && my2/bi <= BY2 ) {
line( mx2/bi, my2/bi, mx/bi, my/bi, mcl[mb] );
} else {
break;
}
mx2 = mx;
my2 = my;
MOS_rdpos( &mb, &mx, &my );
}
}
void cols16(int mb, int mx, int my)
{
int i;
if (mb==1)
{
i=(mx-CSX1)/CSX4;
boxf(CSX1+i*CSX4,CSY1,CSX1+i*CSX4+CSX3,CSY2,mcl[1]);
} else {
egbget(mx,my,mx,my,b);
mcl[1] = WORD(b);
mbclp();
}
}
void cols16g(int mb)
{
int f, i, j, k=0;
egbget(NX1,NY1,NX2,NY2,b);
for ( i=0; i<16; i++ )
{
WORD(b+32768+i*2) = 0;
}
for (i = 0; i < NX4*NY4*2; i+=2)
{
f = 0;
for (j=0; j<k; j++)
{
if (WORD(b+32768+j*2)==WORD(b+i))
{
f = 1;
break;
}
}
if (f==0)
{
WORD(b+32768+k*2) = WORD(b+i);
k++;
}
if (k>15)
break;
}
egbget(CSX1, CSY1, CSX2-CSX4*k, CSY2, b+65536);
egbput(CSX1+CSX4*k, CSY1, CSX2, CSY2, b+65536);
egbputZ(CSX1, CSY1, CSX1+CSX4*k-1, CSY2, k,1, b+32768);
mbout(&mb,&i,&j);
}
void brolls( int mb, int mx, int my )
{
int x2, y2, x3, y3;
mx= mx/bi;
my = my/bi;
do
{
MOS_rdpos( &mb, &x2, &y2 );
x3 = mx - x2/bi & BX3;
y3 = my - y2/bi & BY3;
rollsub( x3, y3, BX1, BY1, BX3, BY3 );
mx = x2/bi;
my = y2/bi;
} while (mb);
}
void colch(int mb, int mx, int my)
{
egbget( BX1,BY1, BX2,BY2, b );
boxf( BX1,BY1, BX2,BY2, mcl[1] );
EGB_writeMode(work,6);
EGB_color(work,3,mcl[2]);
egbput( BX1,BY1, BX2,BY2, b );
EGB_writeMode(work,0);
mbout(&mb, &mx, &my);
}
void pastgo(int mb, int mx, int my)
{
int mx2, my2;
mx2 = gpx(mx);
my2 = gpy(my);
if (mb == 1)
{
wget();
egbput(mx2, my2, mx2+NX3, my2+NY3, wb );
} else {
egbget(mx2, my2, mx2+NX3, my2+NY3, wb );
EGB_writeMode( work, 7 );
egbput( NX1, NY1, NX2, NY2, wb );
EGB_writeMode( work, 0 );
wkk();
mbout(&mb,&mx,&my);
}
}
void mbuff( int mb, int mx, int my ) /* バッファ */
{
view( BX1, BY1, BX2, BY2 );
switch (mei[1])
{
case 1: bfsrgp( mb, mx, my ); break;
case 2: bfdraw( mb, mx, my ); break;
case 3: brolls( mb, mx, my ); break;
case 4: colch( mb, mx, my ); break;
case 5: pastgo( mb, mx, my ); break;
default: bfgp( mb, mx, my ); break;
}
view( 0, 0, 1024/bi-1, 512/bi-1 );
}
void mouse() /* マウス総合領域 */
{
int mb, mx, my, mx2, my2;
unsigned int kb, en;
static char nn[FILENAME_MAX];
while(1)
{
MOS_rdpos( &mb, &mx, &my );
mx2 = mx / bi;
my2 = my / bi;
if ( mei[1] == 2 || mei[1] == 3 ) {
mbwk( mx, my, 0 );
} else {
mbwk( mx, my, 1 );
}
do {
kb = KYB_read(1,&en);
} while (kb==0xffff && KAN_inpchk()==KAN_MISET);
switch(kb)
{
case 0x9:
page(-1);
break;
case 0x1b:
page(1);
break;
default:
break;
}
if (mb) {
if ( mx2 >= WX1 && mx2 <= WX2 &&
my2 >= WY1 && my2 <= WY2 ) {
mnw( mb, mx, my ); /* 編集窓 */
}
if ( mx2 >= BX1 && mx2 <= BX2 &&
my2 >= BY1 && my2 <= BY2 ) {
mbuff( mb, mx, my ); /* バッファ */
}
if ( mx >= MEX1 && my >= MEY1 && mx < MEX1 + MEX4 * MEX2 &&
MEZ0 > (( mx - MEX1 ) / MEX4) + MEX2 * (( my - MEY1 ) / MEY4 ))
{
gmenu( mx, my ); /* 編集メニュー */
}
if ( my2 >= PALY && my2 < (PALY+PALB*3) &&
mx2 >= PALX && mx2 <= PALX + 127) {
mcolm( mb, mx, my ); /* カラーボックス */
}
if ( mx2 >= PCX1 && mx2 <= PCX2 &&
my2 >= PCY1 && my2 <= PCY2 ) {
mcolm2( mb ); /* ボタンへ色セット */
}
if ( mx2 >= PRX1 && mx2 <= PRX2 &&
my2 >= PRY1 && my2 <= PRY2 ) {
mcols( mcl[2-bc] );
}
if ( mx2 >= PLX1 && mx2 <= PLX2 &&
my2 >= PLY1 && my2 <= PLY2 ) {
mcols( mcl[1+bc] );
}
if ( mx >= PAX1 && mx <= PAX2 &&
my >= PAY1 && my <= PAY2 ) {
pbtn( mb ); /* ページ変更 */
}
if ( mx >= SPX1 && mx <= SPX2 &&
my >= SPY1 && my <= SPY2 ) {
mspoit();
}
if ( mx2 >= CBX1 && mx2 <= CBX2 &&
my2 >= CBY1 && my2 <= CBY2 ) {
tclc(mb, mx, my);
}
if ( mx2 >= CBLX1 && mx2 <= CBLX2 &&
my2 >= CBLY1 && my2 <= CBLY2 ) {
tcl(mb, 0);
}
if ( mx2 >= CBRX1 && mx2 <= CBRX2 &&
my2 >= CBRY1 && my2 <= CBRY2 ) {
tcl(mb, 1);
}
if ( mx2 >= NX1 && mx2 <= NX2 &&
my2 >= NY1 && my2 <= NY2 && NX4!=128 ) {
wsize(0);
}
if ( mx >= HX1 && mx <= HX2 &&
my >= HY1 && my <= HY2 ) {
bfgs(mb);
}
if ( mx >= RX1 && mx <= RX2 &&
my >= RY1 && my <= RY2 ) {
rchc();
}
if ( mx2 >= CSX1 && mx2 <= CSX2 &&
my2 >= CSY1 && my2 <= CSY2 ) {
cols16(mb, mx2, my2);
}
if ( mx >= CSBX1 && mx <= CSBX2 &&
my >= CSBY1 && my <= CSBY2 ) {
cols16g(mb);
}
if ( my < 20 )
{
switch(MEN_menu( mb, mx, my ))
{
case 1:
message("G-Pen32k ver.1.000",1);
break;
case 4:
sdk_invoke();
break;
case 101:
if (OKM_fsel( nn, "TIFFload", 0 ) == 0)
tiffload(nn, BX1, BY1);
break;
case 102:
if (OKM_fsel( nn, "TIFFsave", 0 ) == 0)
if (sachk(nn) == 0)
tiffsave(nn, BX1, BY1, BX2, BY2, 0, 0);
break;
case 103:
if (OKM_fsel( nn, "TIFFsave圧縮", 0 ) == 0)
if (sachk(nn) == 0)
{
MOS_typeRom2(82,16,16,mpat);
tiffsave(nn, BX1, BY1, BX2, BY2, 1, 0);
MOS_typeRom2(81,0,0,mpat);
}
break;
case 104:
if (OKM_fsel( nn, "SPRITEload", 0 ) == 0)
sprload( nn, BX1, BY1 );
break;
case 105:
if (OKM_fsel( nn, "SPRITEsave", 0 ) == 0)
if (sachk(nn) == 0)
sprsave( nn, BX1, BY1 );
break;
case 106:
if (OKM_fsel( nn, "PATTERN4load", 0 ) == 0)
ptnload4pg( nn, NX4,NY4 );
break;
case 107:
if (OKM_fsel( nn, "PATTERN4save", 0 ) == 0)
if (sachk(nn) == 0)
ptnsave4pg( nn, NX4,NY4 );
break;
case 201:
wpg(0);
wkugiri(3);
wpg(1);
break;
case 202:
wpg(0);
wkugiri(2);
wpg(1);
break;
case 203:
ten(NX1,NY1,NX4);
wkk();
break;
case 204:
ten(BX1,BY1,BX4);
break;
case 205:
tometen(BX1,BY1,BX2,BY2);
break;
case 206:
EGB_writeMode( work, 10 );
boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
EGB_writeMode( work, 0 );
break;
case 207:
EGB_writeMode( work, 11 );
boxf(BX1-1, BY1-1, BX2+1, BY2+1,0x8000);
EGB_writeMode( work, 0 );
break;
case 9998:
wsize(1);
break;
case 5:
case 9999:
if(message("G-Pen32kを終了します",2)==0)
end();
break;
default:
break;
}
}
}
}
}
void kkpos( int *x, int *y)
{
*x = kkx;
*y = kky;
}
void kkinit(void)
{
static char *kaw;
int col[16] = {
0x08, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x0f,
0x00, 0x09, 0x0a, 0x0b,
0x0c, 0x0d, 0x0e, 0x0f,
};
KANJ kk;
kk.scrn = KAN_SCRN16;
kk.egbw = work;
kk.wPage = 0;
kk.gets = 0;
kk.getPos = kkpos;
kk.mosAp = KAN_MOSON;
kk.maxX = 639;
kk.maxY = 479;
KAN_prepare(&kk);
kaw = malloc( KAN_getWorkSize() );
KAN_setWorkAdd(0x14,kaw);
KAN_setClrTbl(col);
}
_mwset_up_args() { return 0; } /* argc argvを使わない */
void main()
{
/* 初期化 */
EGB_init( work, EgbWorkSize );
EGB_resolution( work, 0, GM0 );
EGB_resolution( work, 1, GM1 );
MOS_start( mwork, MosWorkSize );
MOS_writePage( 0 );
mosv( 0, 0, 639, 479 );
MOS_typeRom2( 81, 1, 1, mpat );
KYB_init();
KYB_clic( 1 );
KYB_setcode( 0x0200);
kkinit();
NX1 = nx[3];
NY1 = ny[3];
NX4 = 64/bi;
NY4 = NX4;
wb = &wallb[672];
mcl[1] = 0x7fff;
for (vz=2000; vp0 == NULL; vz--)
{
vp0 = (char *)calloc( (vz+1)*BX4*BY4*Cb/8, 1 );
}
vp = vp0;
draw(); /* 画面作り */
mouse(); /* メインへ */
}